package com.ld.common.util.filelistener.commonio.impl;

import java.io.File;
import java.io.FileFilter;

import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;

import lombok.extern.slf4j.Slf4j;

/**
 * 文件监听（示例类）
 * 
 * @ClassName FileListenerAdaptor
 * @author <a href="mailto:donggongai@126.com" target="_blank">吕凯</a>
 * @date 2019年1月18日 上午10:25:09
 *
 */
@Slf4j
public class FileListenerAdaptorDemo extends FileAlterationListenerAdaptor {

    /**
     * File system observer started checking event.
     */
    @Override
    public void onStart(FileAlterationObserver observer) {
        super.onStart(observer);
        log.warn("文件系统观察者开始检查事件");
    }

    /**
     * File system observer finished checking event.
     */
    @Override
    public void onStop(FileAlterationObserver observer) {
        super.onStop(observer);
        log.warn("文件系统完成检查事件观测器");
    }

    /**
     * Directory created Event.
     */
    @Override
    public void onDirectoryCreate(File directory) {
        super.onDirectoryCreate(directory);
        log.warn("目录创建事件");
    }

    /**
     * Directory changed Event
     */
    @Override
    public void onDirectoryChange(File directory) {
        super.onDirectoryChange(directory);
        log.warn("目录改变事件");
    }

    /**
     * Directory deleted Event.
     */
    @Override
    public void onDirectoryDelete(File directory) {
        super.onDirectoryDelete(directory);
        log.warn("目录删除事件");
    }

    /**
     * File created Event.
     */
    @Override
    public void onFileCreate(File file) {
        super.onFileCreate(file);
        log.warn("文件创建事件");
        log.warn("文件名称：" + file.getName());

    }

    /**
     * File changed Event.
     */
    @Override
    public void onFileChange(File file) {
        super.onFileChange(file);
        log.warn("文件改变事件");
    }

    /**
     * File deleted Event.
     */
    @Override
    public void onFileDelete(File file) {
        super.onFileDelete(file);
        log.warn("文件删除事件:" + file.getName());
    }

    /**
     * 文件过滤器
     * 
     * @ClassName FileFilterImpl
     * @author <a href="mailto:donggongai@126.com" target="_blank">吕凯</a>
     * @date 2019年1月18日 上午10:37:10
     *
     */
    static final class FileFilterImpl implements FileFilter {

        /**
         * @return return true:返回所有目录下所有文件详细(包含所有子目录)
         * @return return false:返回主目录下所有文件详细(不包含所有子目录)
         */
        @Override
        public boolean accept(File file) {
            log.info("文件路径: " + file);
            log.info("最后修改时间： " + file.lastModified());
            return true;
        }
    }

    public static void main(String[] args) {
        try {

            // 构造观察类主要提供要观察的文件或目录，当然还有详细信息的filter
            FileAlterationObserver observer = new FileAlterationObserver("I:\\software\\eclipse\\eclipse-photon\\logs",
                    new FileFilterImpl());
            // 构造收听类 没啥好说的
            FileListenerAdaptorDemo listener = new FileListenerAdaptorDemo();
            // 为观察对象添加收听对象
            observer.addListener(listener);
            // 配置Monitor，第一个参数单位是毫秒，是监听的间隔；第二个参数就是绑定我们之前的观察对象。
            FileAlterationMonitor fileMonitor = new FileAlterationMonitor(10000, new FileAlterationObserver[] { observer });
            // 启动开始监听
            fileMonitor.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
